﻿window.onload = function(){
	var	lis = document.getElementById( 'comments-block').getElementsByTagName( 'LI'),/* Liオブジェクトを格納 */
		l = lis.length,
		no = 1,
		commentIDs = new Array( l),
		comments = new Array( l),
		authors = new Array( l),
		regAnchor = new RegExp( '(&gt;&gt;|>>)([ 　]?)([0-9]+)', 'i'),
		regLink = new RegExp( "(h?t?tps?|ftp)(:\/\/[A-Z0-9-_;:@%&!~=\/\.\#\?\+\\$']+)", 'i');

	for (var i = 0; i < l; ++i) {
		var	li = lis[ i],
			divs = li.getElementsByTagName( 'DIV');
		for( var j=0; j < divs.length; ++j){
			var div = divs[ j];
			if( div.className.match(/comment-head/)) {
				var as = div.getElementsByTagName( 'A');
				for( var k=0; k < as.length; ++k) {
					var a = as[ k];/* 子ノードを格納 */
					if( a.className.match('comment-anchor')) {
						commentIDs[ i] = a.name;
						++no;
					}
				}
				var spans = div.getElementsByTagName( 'SPAN');
				for( var k=0; k < spans.length; ++k) {
					var span = spans[ k];
					if( span.className.match('comment-author')) {
						authors[ i] = span.innerHTML.replace( /<[^>]*?>/gm, '') +':';
					}
				}					
			}
			if( div.className.match(/comment-body/)) {
				comments[ i] = ( authors[ i] + div.innerHTML).replace( /<[^>]*?>/gm, '').replace( /&gt;/gm, '>').replace( /&amp;/gm, '&');
			}				
		}
	}
	for (var i = 0; i < l; ++i) {
		var li = lis[ i];/* 子ノードを格納 */
		var divs = li.getElementsByTagName( 'DIV');
		for( var j=0; j < divs.length; ++j){
			var div = divs[ j];
			if( div.className.match(/comment-body/)) {
				li.replaceChild( processor( processor( div, anchor), link), div);
			}					
		}
	}
	
	function processor( parent, regFunction){
		var	newParent = parent.cloneNode( false),
			nodes = parent.childNodes,
			l = nodes.length;
		for( var j=0; j < l; ++j) { // 要素数分のループ(テキスト,<br>）
			var elm = nodes[ j].cloneNode( true);
			if( elm){
				if( elm.nodeType === 3) { // 要素がテキストなら以下で>>検索とリンク付与
					var text = regFunction( newParent, elm.nodeValue);
					//　置換部分の後方にテキストあり
					if( text.length > 0){
						newParent.appendChild( document.createTextNode( text));
					}					
				} else if( elm.nodeType === 1){
					if( elm.tagName.toUpperCase() !== 'A' && elm.childNodes && elm.childNodes.length > 0){
						newParent.appendChild( processor( elm, regFunction));
					} else {
						newParent.appendChild( elm);
					}
				}					
			}
		}
		return newParent;
	}
	function anchor( parent, text){
		while (text.match(regAnchor)) {
			text.replace(regAnchor, function(whole, anchor, space, id){
				// 置換部分の前方にテキストあり
				var pos = text.indexOf(whole, 0);
				if (pos > 0) {
					parent.appendChild(document.createTextNode(text.substr(0, pos)));
				}
				id = id -0;
				parent.appendChild( createElmA(
					'#' + commentIDs[ id -1],
					(no > id) ? comments[ id -1] : '(ﾟДﾟ)ハァ?',
					null, whole.replace( />/g, '&gt;')
				));
				
				text = text.substr(pos + whole.length);
				return;
			});
		}
		return text;
	}
	function link( parent, text){
		while( text.match( regLink)) {
			text.replace( regLink, function( whole, protocol, url){
				// 置換部分の前方にテキストあり
				var pos = text.indexOf( whole, 0);
				if (pos > 0) {
					parent.appendChild( document.createTextNode( text.substr(0, pos)));
				}
				parent.appendChild( createElmA(
					whole.replace( /h?t?tp(s?):\/\//i, 'http$1://'),
					null, '_blank', whole
				));
				
				text = text.substr(pos + whole.length);
				return;
			});
		}
		return text;
	}
	function createElmA( href, title, target, inner, name){
		var a = document.createElement('A');
		if( href){
			a.href = href;
		}
		if( title){
			a.title = title;
		}
		if( target){
			a.target = target;
		}
		a.innerHTML = inner;
		if( name){
			a.name = name;
		}				
		return a;
	}
}